package daos;

import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;

import uady.sicei.domain.AlumnoUADYMatriculado;
import uady.sicei.service.web.inscripcion.AlumnoUADYMatriculadoService;

import beans.Encuesta;
import beans.EntidadObjetivo;
import beans.FormatoCuestionario;
import beans.Pregunta;
import beans.Respuesta;

import Utils.HibernateExecuter;
import Utils.IHibernateHQLQuery;

public class EncuestaDao {
    private static EncuestaDao encuestaDao=null;
	
	private EncuestaDao(){
		
	}
	
	public static EncuestaDao getInstance(){
		if(encuestaDao==null)
			encuestaDao=new EncuestaDao();
		return encuestaDao;
		
	}

	public boolean guardarEncuesta(final Encuesta encuesta){
		
		HibernateExecuter hibernateExecuter= new HibernateExecuter();
		try {
			hibernateExecuter.executeQuery
								(
										new IHibernateHQLQuery() 
										{
											public Object executeQuery(Session session) 
											{
												
											session.saveOrUpdate(encuesta);
												return null;
											}
										}
								);
		} catch (Exception e) {
			
			e.printStackTrace();
			return false;
		}

		return true;
				
			}	

	public Encuesta consultarEncuestaById(final int id){

		HibernateExecuter hibernateExecuter= new HibernateExecuter();
		Encuesta encuesta=null;
		try {
			 encuesta=(Encuesta) hibernateExecuter.executeQuery
						(
								new IHibernateHQLQuery() 
								{
									public Object executeQuery(Session session) 
									{
										
								 
										Encuesta encuesta=(Encuesta)	session.get(Encuesta.class, id);
										Hibernate.initialize(encuesta.getFormatoCuestionario());
										FormatoCuestionario formato=encuesta.getFormatoCuestionario();
										inicializarPreguntasFormato(formato);
									return encuesta;
									}
								}
						);
	} catch (Exception e) {

	e.printStackTrace();

	}
		return encuesta;
		
		}
	
	
	
	public Encuesta consultarEncuestaByIdEncuestableAndTipoEncuesta(final int idAlumnoUADYMatriculado,String tipoEncuesta){

	HibernateExecuter hibernateExecuter= new HibernateExecuter();
	Encuesta encuesta=null;
	try {
		 encuesta=(Encuesta) hibernateExecuter.executeQuery
					(
							new IHibernateHQLQuery() 
							{
								public Object executeQuery(Session session) 
								{
									
							  AlumnoUADYMatriculado entidadEncuestable=	AlumnoUADYMatriculadoService.getInstance().getAlumnoUADYMatriculado(idAlumnoUADYMatriculado);
								 	String hql = "select (encuesta) from Encuesta encuesta " +
											"where encuesta.entidadEncuestable.id = :entidadEnc";
								Query query = session.createQuery(hql);
								query.setInteger("entidadEnc", entidadEncuestable.getId());	
								Encuesta encuesta = (Encuesta)query.uniqueResult();
								Hibernate.initialize(encuesta.getFormatoCuestionario());
								FormatoCuestionario formato=encuesta.getFormatoCuestionario();
								inicializarPreguntasFormato(formato);
								return encuesta;
								}
							}
					);
} catch (Exception e) {

e.printStackTrace();

}
	return encuesta;
	
	}
	public List<Encuesta> consultarTodasEncuestas(final Class clase){

		HibernateExecuter hibernateExecuter= new HibernateExecuter();
		List<Encuesta> encuestas=null;
		try {
			 encuestas=(List<Encuesta>)	hibernateExecuter.executeQuery
								(
										new IHibernateHQLQuery() 
										{
											public Object executeQuery(Session session) 
											{
												
										List<Encuesta> encuestas=(List<Encuesta>)	session.createCriteria(clase).list();
										iniciarlizarFormatos(encuestas);	
										
										return encuestas;
											}
										}
								);
		} catch (Exception e) {
			
			e.printStackTrace();
			
		}

		return encuestas;
	}
	
	private void iniciarlizarFormatos(List<Encuesta> encuestas){
		for(Encuesta encuesta : encuestas)
		{
			Hibernate.initialize(encuesta.getFormatoCuestionario());
			Hibernate.initialize(encuesta.getResultadoEncuesta());
			FormatoCuestionario formato=encuesta.getFormatoCuestionario();
			inicializarPreguntasFormato(formato);
			
		}
	}
	
	

	private void inicializarPreguntasFormato(FormatoCuestionario formato){
	
		Hibernate.initialize(formato.getCatalogoPreguntas());
		List<Pregunta>  preguntas=formato.getCatalogoPreguntas();
		for(Pregunta pregunta :preguntas){
			Hibernate.initialize(pregunta.getTipoPregunta());
			inicializarRespuestas(pregunta);
	}}
	

	
	private void inicializarRespuestas(Pregunta pregunta){
		Hibernate.initialize(pregunta.getCatalogoRespuestas());
		List<Respuesta> respuestas=pregunta.getCatalogoRespuestas();
		for(Respuesta respuesta: respuestas){
			Hibernate.initialize(respuesta.getTipoRespuesta());
		Hibernate.initialize(respuesta.getFormatoRespuesta());
		}
		
		
	}
	
	
	
}


